package com.atguigu.springcloud.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class ZuulFilter01 extends ZuulFilter {

    /**
     * 在请求前执行就设置为 'pre' 或者 在请求后执行就设置为 'post'
     *
     * @return
     */
    public String filterType() {
        return "pre";
    }

    /**
     * 数字越小越先执行
     *
     * @return
     */
    public int filterOrder() {
        return 0;
    }

    /**
     * 当前过滤器是否开启， 返回 true 表示开始，false 表示关闭
     *
     * @return
     */
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器内执行的操作 return 任何 object 的值都表示继续执行
     * 不想让他执行就返回 setSendZuulResponse(false);
     *
     * @return
     */
    public Object run() {
        /**
         * 假如网管这块导致请求头信息丢失，我们这样处理
         */
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();

        /**
         * 会在正式通信之前，增加一次HTTP查询请求，称为“预检”请求（preflight）。预检请求为OPTIONS请求，用于向服务器请求权限信息。
         * 预检请求被成功响应后，才会发出真实请求，携带真实数据。
         * axios默认请求就是application/json,所以不需要自己加上头部（不需要在config中加headers），所以总是会发出options请求的，看看是不是配置的时候加了不必要的headers配置项。
         * 另外，如果真的需要预检，后台也需要进行设置，允许options请求。
         */
        if ("OPTIONS".equals(request.getMethod())) {
            return null;
        }

        //放过登陆请求
        if (request.getRequestURL().toString().contains("/login")) {
            return null;
        }


        String authorization = request.getHeader("Authorization");
        if (authorization != null && !"".equals(authorization)) {
            //重新设置请求头
            requestContext.addZuulRequestHeader("Authorization", authorization);
            // 设置返回状态
            //requestContext.setSendZuulResponse(false);
            // 设置返回状态码
            //requestContext.setResponseStatusCode(403);
        }
        return null;
    }
}
